import os
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QAction, QFileDialog
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
from PyQt5.QtCore import QUrl, Qt, QTimer
from PyQt5.QtGui import QImage

# 添加这个类来处理JavaScript和Python之间的通信
class WebEnginePage(QWebEnginePage):
    def __init__(self, parent=None, main_window=None):
        super().__init__(parent)
        # 保存对主窗口的引用
        self.main_window = main_window
        print(f"WebEnginePage初始化，主窗口引用: {main_window is not None}")
    
    def javaScriptConsoleMessage(self, level, message, lineNumber, sourceID):
        # 打印JavaScript控制台消息到Python控制台
        print(f"JS Console: {message} (line {lineNumber}, source: {sourceID})")
    
    def createWindow(self, windowType):
        # 处理所有类型的窗口请求
        print(f"创建新窗口，类型: {windowType}")
        
        # 检查主窗口引用
        if self.main_window is None:
            print("警告：主窗口引用为None")
        
        # 创建新的浏览器窗口
        new_window = QMainWindow()
        new_web_view = QWebEngineView(new_window)
        
        # 创建新的WebEnginePage并设置，重要：传递主窗口引用
        new_page = WebEnginePage(new_web_view, self.main_window)
        new_web_view.setPage(new_page)
        
        new_window.setCentralWidget(new_web_view)
        new_window.resize(350, 450)  # 设置默认大小
        new_window.setWindowTitle("设置")
        
        # 如果有主窗口引用，将新窗口添加到主窗口的子窗口列表中
        if self.main_window:
            self.main_window.child_windows.append(new_window)
            print(f"新窗口已添加到子窗口列表，当前子窗口数量: {len(self.main_window.child_windows)}")
        
        # 关键修复：必须调用show()来显示窗口
        new_window.show()
        print("已调用new_window.show()")
        
        # 确保窗口在最前面
        new_window.raise_()
        new_window.activateWindow()
        print("已调用raise_()和activateWindow()")
        
        # 将新窗口居中显示在屏幕上
        def center_new_window():
            qr = new_window.frameGeometry()
            cp = QApplication.desktop().availableGeometry().center()
            qr.moveCenter(cp)
            new_window.move(qr.topLeft())
            print(f"窗口已居中，位置: {qr.topLeft()}")
        
        # 立即居中窗口
        center_new_window()
        
        # 返回新页面，这是关键，确保JavaScript能正确获取窗口引用
        print("返回new_page，createWindow方法完成")
        return new_page

class HTMLViewer(QMainWindow):
    def __init__(self):
        super().__init__()
        # 创建一个列表来保存子窗口引用，防止被垃圾回收
        self.child_windows = []
        self.init_ui()
    
    def init_ui(self):
        # 设置窗口标题
        self.setWindowTitle('')
        
        # 设置窗口置顶属性
        self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
        # 默认启用窗口置顶
        self.is_stay_on_top = True
        
        # 创建中心部件
        central_widget = QWidget()
        # 移除中心部件的默认边距
        central_widget.setStyleSheet("background-color: transparent; margin: 0px; padding: 0px;")
        self.setCentralWidget(central_widget)
        
        # 创建布局
        layout = QVBoxLayout(central_widget)
        # 设置布局的边距为0，解决白色间距问题
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        
        # 创建Web视图
        self.web_view = QWebEngineView()
        # 设置自定义的WebEnginePage，并传入主窗口引用
        self.web_view.setPage(WebEnginePage(self.web_view, self))
        # 添加JavaScript可以调用的Python函数
        self.web_view.page().setHtml("", QUrl.fromLocalFile(os.path.dirname(os.path.abspath(__file__)) + "/"))
        
        # 设置Web视图的样式表
        self.web_view.setStyleSheet("background-color: transparent;")
        
        # 连接加载完成信号
        self.web_view.loadFinished.connect(self.on_page_loaded)
        
        # 加载同一目录下的index.html文件
        current_dir = os.path.dirname(os.path.abspath(__file__))
        html_file_path = os.path.join(current_dir, 'index.html')
        
        if os.path.exists(html_file_path):
            self.web_view.setUrl(QUrl.fromLocalFile(html_file_path))
        else:
            # 如果index.html文件不存在，显示错误消息
            self.web_view.setHtml('''
                <html>
                <body style="font-family: Arial; text-align: center; padding: 50px;">
                    <h1 style="color: red;">错误</h1>
                    <p>无法找到index.html文件</p>
                    <p>请确保HTML文件与Python程序在同一目录下</p>
                </body>
                </html>
            ''')
        
        # 添加Web视图到布局
        layout.addWidget(self.web_view)
        
        # 删除这一行来移除菜单栏
        # self.create_menu_bar()
    
    # 添加窗口置顶功能的实际实现
    def set_always_on_top(self, always_on_top):
        """设置窗口是否置顶"""
        self.is_stay_on_top = always_on_top
        if always_on_top:
            self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
        else:
            self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
        # 重新显示窗口以应用新的窗口标志
        self.show()
        print(f"窗口置顶设置已更改为: {always_on_top}")
    
    def on_page_loaded(self):
        # 页面加载完成后，首先获取图片比例，然后调整窗口大小
        self.get_image_aspect_ratio_and_adjust_window()
        
        # 注入JavaScript函数，允许HTML调用Python功能
        # 注册Python对象到JavaScript
        self.web_view.page().setWebChannel(self.create_web_channel())
        
        self.web_view.page().runJavaScript('''
            // 添加一个外部接口供JavaScript调用
            window.external = {
                // 设置窗口置顶功能
                setAlwaysOnTop: function(alwaysOnTop) {
                    // 现在通过WebChannel调用Python方法
                    pywebchannel.setAlwaysOnTop(alwaysOnTop);
                    console.log('设置窗口置顶:', alwaysOnTop);
                }
            };
        ''')
    
    def create_web_channel(self):
        """创建WebChannel用于JavaScript和Python通信"""
        from PyQt5.QtWebChannel import QWebChannel
        
        # 创建WebChannel
        channel = QWebChannel()
        
        # 创建一个暴露给JavaScript的对象
        class Bridge(QWidget):
            def __init__(self, parent=None):
                super().__init__(parent)
                self.parent = parent
            
            def setAlwaysOnTop(self, always_on_top):
                # 调用主窗口的方法
                if self.parent:
                    self.parent.set_always_on_top(always_on_top)
        
        # 创建桥接对象并注册到WebChannel
        self.bridge = Bridge(self)
        channel.registerObject('pywebchannel', self.bridge)
        
        return channel
    
    def get_image_aspect_ratio_and_adjust_window(self):
        # 获取图片文件路径
        current_dir = os.path.dirname(os.path.abspath(__file__))
        image_path = os.path.join(current_dir, 'images', '赫连赫苍.png')
        
        # 默认宽高比（如果无法加载图片）
        aspect_ratio = 16 / 9
        
        # 尝试加载图片获取实际宽高比
        if os.path.exists(image_path):
            image = QImage(image_path)
            if not image.isNull():
                aspect_ratio = image.width() / image.height()
        
        # 设置窗口的最大宽度（根据屏幕大小调整）
        screen = QApplication.desktop().screenGeometry()
        max_width = int(screen.width() * 0.6)  # 窗口最大宽度为屏幕宽度的60%
        
        # 根据宽高比计算窗口高度
        window_width = max_width
        window_height = int(window_width / aspect_ratio)
        
        # 检查高度是否过大，调整为适合屏幕的尺寸
        if window_height > screen.height() * 0.8:
            window_height = int(screen.height() * 0.8)
            window_width = int(window_height * aspect_ratio)
        
        # 设置窗口大小
        self.resize(window_width, window_height)
        
        # 显示窗口并居中
        self.show()
        self.center_window()
    
    def center_window(self):
        # 计算窗口居中位置
        qr = self.frameGeometry()
        cp = QApplication.desktop().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
    
    def create_menu_bar(self):
        # 创建菜单栏
        menubar = self.menuBar()
        
        # 创建文件菜单
        file_menu = menubar.addMenu('文件')
        
        # 创建打开文件动作
        open_action = QAction('打开HTML文件', self)
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)
        
        # 创建退出动作
        exit_action = QAction('退出', self)
        exit_action.setShortcut('Ctrl+Q')
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)
        
    def open_file(self):
        # 打开文件对话框
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getOpenFileName(
            self, "打开HTML文件", "", "HTML Files (*.html *.htm);;All Files (*)", options=options
        )
        
        # 如果用户选择了文件，加载该文件
        if file_path:
            self.web_view.setUrl(QUrl.fromLocalFile(file_path))
            # 更新窗口标题以显示当前文件路径
            self.setWindowTitle(f'草原悍将·赫连赫苍 - {os.path.basename(file_path)}')

if __name__ == '__main__':
    # 启用高DPI支持，适应系统缩放比例
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
    # 设置高DPI像素图支持
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
    
    # 创建应用程序实例
    app = QApplication(sys.argv)
    # 创建并显示窗口
    window = HTMLViewer()
    window.show()
    # 运行应用程序的主循环
    sys.exit(app.exec_())